package com.jiyun.user.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.json.JSONUtil;
import com.jiyun.Result.Result;
import com.jiyun.Result.ResultCodeEnum;
import com.jiyun.common.exception.ZcException;
import com.jiyun.common.pojo.home.User;
import com.jiyun.common.pojo.user.Dto.UserPass;
import com.jiyun.common.util.SmsUtil;
import com.jiyun.user.mapper.UserMapper;

import com.jiyun.user.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PathVariable;

import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

@Service
@Slf4j
@Transactional
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 用户登录方法
     * 该方法接收一个User对象作为参数，该对象包含了用户登录所需的信息，如用户名和密码
     * 然后调用userMapper的login方法进行登录验证，返回验证结果
     *
     * @param user1 包含用户名和密码等登录信息的User对象
     * @return 如果登录成功，返回登录成功的用户信息；如果登录失败，返回null
     */
    @Override
    public User login(User user1) {
        User user = userMapper.login(user1);
        return user;
    }

    /**
     * 发送验证码到指定手机
     * 该方法首先生成一个随机数作为验证码，然后通过短信服务发送该验证码到指定手机，
     * 并将验证码存储在Redis中，以供后续验证使用
     *
     * @param phone 接收验证码的手机号码
     * @throws Exception 如果验证码生成或发送过程中发生错误，则抛出异常
     */
    @Override
    public void sendCode(String phone) throws Exception {
        //生成随机数
        int code = RandomUtil.randomInt(1000, 10000);
        log.info("生成随机数:{}", code);
        //发送短信
        SmsUtil.sendSms(phone, code + "");
        //存入redis，code 有效期，key set
        //redis 基本数据类型：String List Set Zset hash
        //key：手机号 USER:REGISTER:CODE:132
        //value：验证码code
        redisTemplate.opsForValue().set("USER:REGISTER:CODE:" + phone, code + "", 5, TimeUnit.MINUTES);
    }

    /**
     * 注册用户
     *
     * @param user 用户对象，包含用户信息如用户名和验证码
     * @throws ZcException 如果验证码错误，则抛出此异常
     */
    @Override
    public void register(User user) {
        // 从Redis中获取用户名对应的验证码
        String o = (String) redisTemplate.opsForValue().get("USER:REGISTER:CODE:" + user.getUsername());
        // 检查用户提供的验证码是否与Redis中存储的验证码匹配
        if (o == null) {
            throw new ZcException(ResultCodeEnum.USER_NOT_EXIST);
        }
        if (!o.equals(user.getCode())) {
            // 如果验证码不匹配，则抛出异常，提示验证码错误
            throw new ZcException(ResultCodeEnum.CODE_ERROR);
        }
        // 验证码匹配，调用用户映射器的注册方法进行用户注册
        userMapper.register(user);
    }
    /**
     * 根据用户ID查找用户信息
     *
     * @param id 用户ID，通过URL路径变量传递
     * @return 返回User对象，如果找不到则返回null
     */

//    @Override
//    public User findById(@PathVariable("id") Integer id) {
//        return userMapper.findById(id);
//    }

    /**
     * 更新用户密码
     *
     * @param byId 包含新密码的用户对象
     * @return 返回更新操作的结果，true表示成功，false表示失败
     */
//    @Override
//    public Boolean updatePsd(User byId) {
//        return userMapper.updatePsd(byId);
//    }

//    /**
//     * 修改用户密码
//     *
//     * @param username 用户名
//     * @param oldPassword 旧密码
//     * @param newPassword 新密码
//     * @return 如果密码修改成功返回true，否则返回false
//     */
//    @Override
//    public boolean changePassword(String username, String oldPassword, String newPassword) {
//        // 根据用户名查询用户信息
//        User user = userMapper.selectUserByUsername(username);
//        // 验证用户是否存在以及旧密码是否正确
//        if (user != null && user.getPassword().equals(oldPassword)) {
//            // 如果用户存在且旧密码匹配，更新密码
//            userMapper.updateUserPassword(username, newPassword);
//            return true;
//        }
//        // 如果用户不存在或旧密码不匹配，返回false
//        return false;
//    }

    @Override
    public Result findUserById(String token) {
        Object o = redisTemplate.opsForValue().get(token);
        if (o != null) {
            User user = JSONUtil.toBean(o.toString(), User.class);
            User byId = userMapper.findById(user.getId());
            return Result.build(byId, ResultCodeEnum.SUCCESS);
        }
        return Result.build(null, ResultCodeEnum.LOGIN_AUTH);
    }

    @Override
    public Result UpdatePassWord(UserPass userPass) {
        userMapper.UpdatePassWord(userPass);
        return Result.ok();
    }

    @Override
    public Result updateUser(User user) {
        userMapper.updateUser(user);
        return Result.ok();
    }

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

}
